package algo_lignes_sites.params.param_component;

import commons.params.param_component.AbstractParamComponent_table;
import algo_lignes_sites.params.Params_ls;
import algo_lignes_sites.params.ParamsManager_ls;
import algo_lignes_sites.params.objects.contraintesgeom.ContrainteGeomLine;
import commons.utils.Utils.Side;
import java.util.ArrayList;
import javax.swing.JComponent;

public class ParamComponent_table_ContrainteGeomLine extends AbstractParamComponent_table {

	public ParamComponent_table_ContrainteGeomLine(String name, ParamsManager_ls paramsManager, JComponent component, boolean bCanBeNull) {
		super(name, paramsManager, component, bCanBeNull,
				new String[] {"Nom catégorie", "Epaissseur ligne (mm)", "Espace (mm)", "Epaisseur dissymétrie (mm)", "Côté dissymétrie"},
				new String[] {"nomCategorie", "epaisseur", "espace", "epaisseurDissymetrie", "coteDissymetrie"},
				new Class[] {String.class, String.class, String.class, String.class, String.class});
		
		Integer[] colSize = new Integer[NB_COL];
		colSize[0] = 150;
		colSize[1] = 100;
		colSize[2] = 100;
		colSize[3] = 100;
		colSize[4] = 100;
		setColumnSize(colSize);
	}

	// appelée à la fin par ParamsManager afin de constituer le Params
	// l'argument params permet de retrouver certains objets déjà lus, via leur nom
	//  (les catégories, en l'occurence)
	public ArrayList<ContrainteGeomLine> getVContrainteGeomLine(Params_ls params) {
		ArrayList<ContrainteGeomLine> vCGL = new ArrayList<ContrainteGeomLine>();

		for (int numRow = 0; numRow <data.size() ; numRow++) {
			Object[] rowData = data.get(numRow);

			String s_nomCat = (String) rowData[0]; assert(s_nomCat!=null); // ne peut etre null
			
			String s_epaisseur = (String) rowData[1]; if (s_epaisseur==null) s_epaisseur="";
			String s_espace = (String) rowData[2]; if (s_espace==null) s_espace="";
			String s_epaisseurDissy = (String) rowData[3]; if (s_epaisseurDissy==null) s_epaisseurDissy="";

			Double epaisseur = s_epaisseur.isEmpty() ? Double.NaN : Double.parseDouble(s_epaisseur);
			Double espace = s_espace.isEmpty() ? Double.NaN : Double.parseDouble(s_espace);
			Double epaisseurDissy = s_epaisseurDissy.isEmpty() ? Double.NaN : Double.parseDouble(s_epaisseurDissy);
			
			// La disymétrie est null ssi epaisseur disymetrie =vide ou ==0
			Side sideDisymetrie;
			String choix = (String) rowData[4];
			if (choix==null || choix.length()==0) {
				assert(Double.isNaN(epaisseurDissy) || epaisseurDissy==0.0); // testé dans l'IHM
				sideDisymetrie = null;
			} else {
				assert(!Double.isNaN(epaisseurDissy) && epaisseurDissy>0.0); // testé dans l'IHM
				sideDisymetrie = Side.valueOf(choix);
			}

			ContrainteGeomLine cgl = new ContrainteGeomLine(params.getCategoryPathByName(s_nomCat),	epaisseur, espace, epaisseurDissy, sideDisymetrie);
			vCGL.add(cgl);
		}
		return vCGL;
	}


	//**************************************************************************
	//**************************************************************************

	@Override
	public void makeStandardControls() {
		assert possibleValues[0] != null;

		// Test si la table peut etre vide
		if (!bCanBeNull && bIsNull) {
			invalidateComponent("Il est obligatoire de déclarer des contraintes", true);
			return;
		}

		beginControls();

		// Parcourt des row
		for (int row = 0; row <data.size() ; row++) {
			
			String sVal;
					
			//***** Nom de la catégorie, obligatoire et sans doublon
			basicCheck_NoDoublon(row, 0);

			//***** Epaisseur de la ligne, pas obligatoire
			sVal = (String) data.get(row)[1];
			if ( sVal!=null && !sVal.isEmpty() )
				basicCheck_FloatStrictPos(row, 1);

			//***** Espace autour, pas obligatoire
			sVal = (String) data.get(row)[2];
			if ( sVal!=null && !sVal.isEmpty() )
				basicCheck_FloatStrictPos(row, 2);

			//***** Epaisseur dissymétrie, pas obligatoire : 0 = pas de dissymetrie, vide = on prend la valeur d'un autre cgl qui s'applique à l'objet, dans l'ordre de parcours
			sVal = (String) data.get(row)[3];
			if ( sVal!=null && !sVal.isEmpty() ) {
				// si renseigné, doit etre un flotant >= 0
				if (basicCheck_FloatPos(row, 3)) {

					// on ne teste la derniere colonne que s'il y a effectivement une valeur dans l'épaisseur de dissymétrie
					double epaisseurDissymetrie = Double.parseDouble((String) data.get(row)[3]);

					//***** Côté de la dissymétrie
					int col=4;
					String cote = (String) data.get(row)[col];
					if (epaisseurDissymetrie==0.0) {
						// le cote doit etre vide
						if (cote!=null && cote.length()>0)
							addError(row, col, "Ce paramètre doit être vide si l'épaisseur de dissymétrie vaut 0");
					} else {
						// sinon, test standard (non vide et doit faire partie des valeurs possibles
						basicCheck(row, col);
					}
				}
			} else {
				// si non renseigné, le côté de la dissy doit être vide
				int col=4;
				String cote = (String) data.get(row)[col];
				if (cote!=null && cote.length()>0)
					addError(row, col, "Ce paramètre doit être vide si l'épaisseur de dissymétrie est vide");
			}

		}
		finaliseControls();
	}

}
